﻿/**
* Стоительная единица для меню
* @author Firsoff Maxim, ICQ:235859730, email: firsoff_maxim@mail.ru
* @version 0.1/10.03.2008 11:33
*/

package ru.vega_int.firsoff.as3.menu 
{
	import flash.display.Sprite;
	import flash.geom.ColorTransform;
	import fl.motion.Color;
	import flash.text.*;
	import flash.events.*;
	import fl.transitions.*;
	import fl.transitions.easing.*;
	import ru.vega_int.firsoff.as3.events.MenuEvent;

	
	public class MenuItem extends Sprite
	{
		//	PROPERTIES
		private var _id:uint;					//	идентификатор
		private var _label:String;				//	заголовок
		private var _colorSchema:Object;		//	цветовая схема
		private var _fontSchema:Object;			//	схема шрифтов
		
		private var _antiAliasType:String;		//	тип сглаживания
		private var _useAdvancedAntiAlias:Boolean;	//	флаг использования расширенного сглаживания
		private var _thickness:Number;			//	толщина
		private var _sharpness:Number;			//	резкость
		
		private var _rollOverFormat:TextFormat;	//	формат для ролловера
		private var _rollOutFormat:TextFormat;	//	формат для роллаута
		private var _pressFormat:TextFormat;	//	формат для нажатия
		
		private var _rollOverColor:uint;		//	цвет для ролловера
		private var _rollOutColor:uint;			//	цвет для роллаута
		private var _pressColor:uint;			//	цвет для нажатия
		private var _switchTime:Number;			//	время переключения между цветами
		
		private var _currentColor:uint;			//	текущий цвет
		private var _labelField:TextField;		//	текстовое поле
		
		private var _selected:Boolean;			//	флаг выделения
		
		private var _color:ColorTransform;		//	цветовой трансформер 
		private var _tween:Tween;				//	твинер цвета
		private var _tweenObj:Object;
		private var _colorChangeProgress:Number;	//	прогресс изменения цвета
		
		//	-------------------------------------------
		
		public function MenuItem(data:Object, colorSchema:Object, fontSchema:Object) 
		{
			this._id = data.id;
			this._label = data.label;
			this._colorSchema = colorSchema;
			this._fontSchema = fontSchema;
			
			this._antiAliasType = fontSchema.antiAliasType;
			if(this._antiAliasType == AntiAliasType.ADVANCED)
			{
				_useAdvancedAntiAlias = true;
				_thickness = fontSchema.thickness;
				_sharpness = fontSchema.sharpness;
			};
			
			_rollOverFormat = fontSchema.rollover;
			_rollOutFormat = fontSchema.rollout;
			_pressFormat = fontSchema.press;
			
			_rollOverColor = colorSchema.rollover;
			_rollOutColor = colorSchema.rollout;
			_pressColor = colorSchema.press;
			_switchTime = colorSchema.time;
			
			this.useHandCursor = this.buttonMode = true;
			init();
			
		};
		
		//	METHODS
		private function init():void
		{
			_currentColor = _rollOutColor;
			_selected = false;
			_labelField = new TextField();
			_labelField.autoSize = TextFieldAutoSize.LEFT;
			//trace(_rollOutFormat)
			_labelField.embedFonts = true;
			_labelField.selectable = false;
			_labelField.mouseEnabled = false;
			_labelField.antiAliasType = _antiAliasType;
			_labelField.thickness = _thickness;
			_labelField.sharpness = _sharpness;
			_labelField.text = _label;
			_labelField.setTextFormat(_rollOutFormat);
			addChild(_labelField);
			
			_color = new ColorTransform();
			_color.color = _currentColor;
			this.transform.colorTransform = _color;
			
			_tweenObj = new Object();
			_tweenObj.progress = 0;
			
			setEvents();
		};
		
		/**
		 * Плавная смена цвета
		 * @param	beginColor		Начальный цвет
		 * @param	finishColor		Конечный цвет
		 */
		private function changeColor(beginColor:uint, finishColor:uint):void
		{
			var tweenObj:Object = new Object();
			tweenObj.progress = 0;
			tweenObj.beginColor = beginColor;
			tweenObj.finishColor = finishColor;
			_tween = new Tween(tweenObj, 'progress', None.easeIn, 0, 1, _switchTime, true);
			_tween.addEventListener(TweenEvent.MOTION_CHANGE, handleProgress);
			_tween.addEventListener(TweenEvent.MOTION_FINISH, handleFinish);
		};
		
		private function setEvents():void
		{
			this.addEventListener(MouseEvent.ROLL_OVER, handleOver);
			this.addEventListener(MouseEvent.ROLL_OUT, handleOut);
			this.addEventListener(MouseEvent.CLICK, handleClick);
		};
		
		//private function 
		//	-------------------------------------------
		
		//	GETTERS/SETTERS
		
		public function get id() :uint
		{
			return _id;
		};
		
		public function get label() :String
		{
			return _label;
		};
		
		public function get selected() :Boolean
		{
			return _selected;
		};
		
		/**
		 * Установка выделения =) (как то хреново звучит....)
		 */
		public function set selected(value:Boolean) 
		{
			_selected = value;
			this.mouseEnabled = !value;
			if (value) 
			{
				changeColor(this.transform.colorTransform.color, _pressColor);
			}
			else 
			{
				changeColor(this.transform.colorTransform.color, _rollOutColor);
			};
		};
		//	-------------------------------------------
		
		//	HANDLERS
		private function handleOver(e:MouseEvent=null):void
		{
			if(!_selected)
			{
				changeColor(this.transform.colorTransform.color, _rollOverColor)
			};
		};
		
		private function handleOut(e:MouseEvent=null):void
		{
			if(!_selected)
			{
				changeColor(this.transform.colorTransform.color, _rollOutColor);
			};
		};
		
		private function handleClick(e:MouseEvent=null):void
		{
			this.dispatchEvent(new MenuEvent(MenuEvent.CLICK));
		};
		
		private function handleProgress(e:TweenEvent):void
		{ 
			var tObj:Object = (Tween(e.target).obj);
			var fromColor:ColorTransform = new ColorTransform();
			fromColor.color = tObj.beginColor;
			var toColor:ColorTransform = new ColorTransform();
			toColor.color = tObj.finishColor;
			this.transform.colorTransform = Color.interpolateTransform(fromColor, toColor, e.position);
		};
		
		private function handleFinish(e:TweenEvent):void
		{
			Tween(e.target).removeEventListener(e.type, handleFinish);
			Tween(e.target).removeEventListener(TweenEvent.MOTION_CHANGE, handleProgress);
			Tween(e.target).obj = null;
		};
		//	-------------------------------------------
	}
	
}
